home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / probots.arc / SNIPER.PR < prev    next >
Text File  |  1991-04-28  |  4KB  |  131 lines

  1.   PROCEDURE Sniper;
  2.  
  3.     { Sniper is based on a C-Robot by Tom Poindexter }
  4.  
  5.     { Strategy: Since a scan of the entire battlefield can be done in 90 }
  6.     { degrees from a corner, sniper can scan the field quickly. }
  7.  
  8.     { "Global" variables, that can be used by any function or procedure }
  9.   VAR
  10.     corner         : Integer; { current corner 0, 1, 2, or 2 }
  11.     c1x, c1y       : Integer; { corner 1 x and y }
  12.     c2x, c2y       : Integer; {   "    2 "  "  " }
  13.     c3x, c3y       : Integer; {   "    3 "  "  " }
  14.     c4x, c4y       : Integer; {   "    4 "  "  " }
  15.     s1, s2, s3, s4 : Integer; { starting scan position for corner 1 - 4 }
  16.     sc             : Integer; { current scan start }
  17.     d              : Integer; { last damage check }
  18.     closest        : Integer; { check for targets in range }
  19.     Range          : Integer; { range to target }
  20.     dir            : Integer; { scan direction }
  21.  
  22.     { new corner procedure to move to a different corner }
  23.     PROCEDURE new_corner;
  24.  
  25.     VAR
  26.       x, y           : Integer;
  27.       Angle          : Integer;
  28.       New            : Integer;
  29.  
  30.  
  31.     BEGIN
  32.       New := Random(4); { pick a random corner }
  33.       IF (New = corner) THEN { but make it different than the }
  34.         corner := (New+1) MOD 4 { current corner }
  35.       ELSE
  36.         corner := New;
  37.       IF (corner = 0) THEN BEGIN { set new x,y and scan start }
  38.         x := c1x;
  39.         y := c1y;
  40.         sc := s1;
  41.       END;
  42.       IF (corner = 1) THEN BEGIN
  43.         x := c2x;
  44.         y := c2y;
  45.         sc := s2;
  46.       END;
  47.       IF (corner = 2) THEN BEGIN
  48.         x := c3x;
  49.         y := c3y;
  50.         sc := s3;
  51.       END;
  52.       IF (corner = 3) THEN BEGIN
  53.         x := c4x;
  54.         y := c4y;
  55.         sc := s4;
  56.       END;
  57.  
  58.       { find the heading we need to get to the desired corner }
  59.       Angle := Angle_To(x, y);
  60.  
  61.       { start drive train, full speed }
  62.       drive(Angle, 100);
  63.  
  64.       { keep traveling until we are within 150 meters }
  65.       { speed is checked in case we run into wall, other robot }
  66.       { not terribly great, since were are doing nothing while moving }
  67.  
  68.       WHILE ((distance(loc_x, loc_y, x, y) > 150) AND (speed > 0)) DO
  69.         ;
  70.  
  71.       { cut speed, and creep the rest of the way }
  72.  
  73.       drive(Angle, 20);
  74.       WHILE ((distance(loc_x, loc_y, x, y) > 20) AND (speed > 0)) DO
  75.         ;
  76.  
  77.       { stop drive, should coast in the rest of the way }
  78.       drive(Angle, 0);
  79.     END; { end of new_corner }
  80.  
  81.  
  82.   BEGIN {Sniper Main}
  83.  
  84.     { initialize the corner info }
  85.     { x and y location of a corner, and starting scan degree }
  86.     c1x := 10; c1y := 10; s1 := 0;
  87.     c2x := 10; c2y := 990; s2 := 270;
  88.     c3x := 990; c3y := 990; s3 := 180;
  89.     c4x := 990; c4y := 10; s4 := 90;
  90.     closest := 9999;
  91.     new_corner; { start at a random corner }
  92.     d := damage; { get current damage }
  93.     dir := sc; { starting scan direction }
  94.  
  95.     REPEAT {UNTIL DEAD OR WINNER}
  96.  
  97.       WHILE (dir < sc+90) DO BEGIN { scan through 90 degree range }
  98.         Range := scan(dir, 5); { look at a direction }
  99.         IF ((Range <= 700) AND (Range > 0)) THEN BEGIN
  100.           WHILE (Range > 0) DO BEGIN { keep firing while in range }
  101.             closest := Range; { set closest flag }
  102.             cannon(dir, Range); { fire! }
  103.             Range := scan(dir, 5); { check target again }
  104.             IF (d+15 > damage) THEN { sustained several hits, }
  105.               Range := 0; { goto new corner }
  106.           END;
  107.           dir := dir-10; { back up scan, in case }
  108.         END;
  109.  
  110.         dir := dir+10; { increment scan }
  111.         IF (d <> damage) THEN BEGIN { check for damage incurred }
  112.           new_corner; { we're hit, move now }
  113.           d := damage;
  114.           dir := sc;
  115.         END;
  116.       END; { WHILE (dir < sc + 90) -- scan through 90 degree range }
  117.  
  118.       IF (closest = 9999) THEN BEGIN { check for any targets in range }
  119.         new_corner; { nothing, move to new corner }
  120.         d := damage;
  121.         dir := sc;
  122.       END
  123.       ELSE BEGIN { targets in range, resume }
  124.         dir := sc;
  125.         closest := 9999;
  126.       END;
  127.  
  128.     UNTIL Dead OR Winner; {REPEAT}
  129.  
  130.   END; { end of Sniper Main }
  131.